/*
 * Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package javax.management.loading;

// java import

import java.net.URL;
import java.net.MalformedURLException;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * This class represents the contents of the <CODE>MLET</CODE> tag.
 * It can be consulted by a subclass of {@link MLet} that overrides
 * the {@link MLet#check MLet.check} method.
 *
 * @since 1.6
 */
public class MLetContent {


  /**
   * A map of the attributes of the <CODE>MLET</CODE> tag
   * and their values.
   */
  private Map<String, String> attributes;

  /**
   * An ordered list of the TYPE attributes that appeared in nested
   * &lt;PARAM&gt; tags.
   */
  private List<String> types;

  /**
   * An ordered list of the VALUE attributes that appeared in nested
   * &lt;PARAM&gt; tags.
   */
  private List<String> values;

  /**
   * The MLet text file's base URL.
   */
  private URL documentURL;
  /**
   * The base URL.
   */
  private URL baseURL;


  /**
   * Creates an <CODE>MLet</CODE> instance initialized with attributes read
   * from an <CODE>MLET</CODE> tag in an MLet text file.
   *
   * @param url The URL of the MLet text file containing the <CODE>MLET</CODE> tag.
   * @param attributes A map of the attributes of the <CODE>MLET</CODE> tag. The keys in this map
   * are the attribute names in lowercase, for example <code>codebase</code>.  The values are the
   * associated attribute values.
   * @param types A list of the TYPE attributes that appeared in nested &lt;PARAM&gt; tags.
   * @param values A list of the VALUE attributes that appeared in nested &lt;PARAM&gt; tags.
   */
  public MLetContent(URL url, Map<String, String> attributes,
      List<String> types, List<String> values) {
    this.documentURL = url;
    this.attributes = Collections.unmodifiableMap(attributes);
    this.types = Collections.unmodifiableList(types);
    this.values = Collections.unmodifiableList(values);

    // Initialize baseURL
    //
    String att = getParameter("codebase");
    if (att != null) {
      if (!att.endsWith("/")) {
        att += "/";
      }
      try {
        baseURL = new URL(documentURL, att);
      } catch (MalformedURLException e) {
        // OK : Move to next block as baseURL could not be initialized.
      }
    }
    if (baseURL == null) {
      String file = documentURL.getFile();
      int i = file.lastIndexOf('/');
      if (i >= 0 && i < file.length() - 1) {
        try {
          baseURL = new URL(documentURL, file.substring(0, i + 1));
        } catch (MalformedURLException e) {
          // OK : Move to next block as baseURL could not be initialized.
        }
      }
    }
    if (baseURL == null) {
      baseURL = documentURL;
    }

  }

  // GETTERS AND SETTERS
  //--------------------

  /**
   * Gets the attributes of the <CODE>MLET</CODE> tag.  The keys in
   * the returned map are the attribute names in lowercase, for
   * example <code>codebase</code>.  The values are the associated
   * attribute values.
   *
   * @return A map of the attributes of the <CODE>MLET</CODE> tag and their values.
   */
  public Map<String, String> getAttributes() {
    return attributes;
  }

  /**
   * Gets the MLet text file's base URL.
   *
   * @return The MLet text file's base URL.
   */
  public URL getDocumentBase() {
    return documentURL;
  }

  /**
   * Gets the code base URL.
   *
   * @return The code base URL.
   */
  public URL getCodeBase() {
    return baseURL;
  }

  /**
   * Gets the list of <CODE>.jar</CODE> files specified by the <CODE>ARCHIVE</CODE>
   * attribute of the <CODE>MLET</CODE> tag.
   *
   * @return A comma-separated list of <CODE>.jar</CODE> file names.
   */
  public String getJarFiles() {
    return getParameter("archive");
  }

  /**
   * Gets the value of the <CODE>CODE</CODE>
   * attribute of the <CODE>MLET</CODE> tag.
   *
   * @return The value of the <CODE>CODE</CODE> attribute of the <CODE>MLET</CODE> tag.
   */
  public String getCode() {
    return getParameter("code");
  }

  /**
   * Gets the value of the <CODE>OBJECT</CODE>
   * attribute of the <CODE>MLET</CODE> tag.
   *
   * @return The value of the <CODE>OBJECT</CODE> attribute of the <CODE>MLET</CODE> tag.
   */
  public String getSerializedObject() {
    return getParameter("object");
  }

  /**
   * Gets the value of the <CODE>NAME</CODE>
   * attribute of the <CODE>MLET</CODE> tag.
   *
   * @return The value of the <CODE>NAME</CODE> attribute of the <CODE>MLET</CODE> tag.
   */
  public String getName() {
    return getParameter("name");
  }


  /**
   * Gets the value of the <CODE>VERSION</CODE>
   * attribute of the <CODE>MLET</CODE> tag.
   *
   * @return The value of the <CODE>VERSION</CODE> attribute of the <CODE>MLET</CODE> tag.
   */
  public String getVersion() {
    return getParameter("version");
  }

  /**
   * Gets the list of values of the <code>TYPE</code> attribute in
   * each nested &lt;PARAM&gt; tag within the <code>MLET</code>
   * tag.
   *
   * @return the list of types.
   */
  public List<String> getParameterTypes() {
    return types;
  }

  /**
   * Gets the list of values of the <code>VALUE</code> attribute in
   * each nested &lt;PARAM&gt; tag within the <code>MLET</code>
   * tag.
   *
   * @return the list of values.
   */
  public List<String> getParameterValues() {
    return values;
  }

  /**
   * Gets the value of the specified
   * attribute of the <CODE>MLET</CODE> tag.
   *
   * @param name A string representing the name of the attribute.
   * @return The value of the specified attribute of the <CODE>MLET</CODE> tag.
   */
  private String getParameter(String name) {
    return attributes.get(name.toLowerCase());
  }

}
